from strategy.StrategyTemplate import StrategyTemplate
from strategy import strategy_filter
from utils.db import DbHandler
from strategy.pro_strategy.pro_strategy_common import threelowroll_column


class ThreeLowRoll(StrategyTemplate):
    """
    三低轮动策略
        三低评分 = 可转债当前价格 × (1+溢价率) × 剩余规模，越低越好
        150 无阈值 170 160 140 130
    买入方法:

        等权重买入排名前5或前10的转债
        等权重的意思就是，买入相同或相近金额。
    卖出方法:

        每周固定时间轮动
        比如本周一14:00买了前5只，下周一14:00看名单，还在前5的留下，不在的剔除，纳入新进入的
        中间无论亏损或者盈利都不管，放着不动，到计划的时间再进行操作
    详细介绍: 三低轮动策略

    展示总数: 20

    """
    def __init__(self):
        super(self.__class__, self).__init__()
        self.strategy_name = "启四三低轮动策略"
        self.strategy_descrption = "按涨幅排序"

    def run(self):
        # 基础过滤，过滤掉新债、强赎、EB
        self.data = strategy_filter.filter_base(self.data)
        self.data = self.data.loc[self.data['剩余年限'] >= 0.6]
        self.data['评分'] = round(self.data['现价'] * (1 + self.data['溢价率'] / 100) * self.data['剩余规模'],3)
        self.data = self.data.sort_values(by='评分', ascending=True)
        self.data = self.data[['转债名称', '转债代码', '现价', '涨跌幅', '溢价率', '剩余年限', '转股价值',
                               '剩余规模', '评分', '强赎状态', '行业', '正股波动率', '基金持仓']]
        # 清掉原来的索引
        self.data.reset_index(inplace=True, drop=True)

    def api(self, size=10):

        db = DbHandler()
        db.create_session()
        super(self.__class__, self).api(db=db)

        self.data = strategy_filter.filter_st_bond(self.data)
        self.data = strategy_filter.filter_new_bond(self.data)

        # 溢价率小于等于30
        self.data = self.data.loc[self.data['year_left'] >= 0.6]
        self.data['score'] = round(self.data['price'] * (1 + self.data['premium_rt'] / 100) * self.data['curr_iss_amt'], 3)
        self.data = self.data.sort_values(by='score', ascending=True)
        self.data['fund_rt'] = self.data['fund_rt'].fillna(0)

        pd_bond_data = self.data[threelowroll_column]
        self.db.close_session()
        return pd_bond_data

if __name__ == '__main__':
    ins = ThreeLowRoll()
    ins.topN = 10
    ins.test()

